Created favourite settings functionality #727

This commit is contained in:
Daniël van Noord
2021-04-02 23:20:19 +02:00
parent ddc77b332d
commit 9a84b0abe5
14 changed files with 193 additions and 125 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,13 @@
import { FavouriteSettings } from '../../Disp/VariablesAndData';
/**
* This function toggles whether a setting is part of the favourites section in setting or not
* @param {string} config The name of the toggleable config option
*/
export default function ToggleFavouriteSetting(config) {
if (FavouriteSettings.includes(config))
FavouriteSettings = FavouriteSettings.filter(function (ele) {
return ele !== config;
});
else FavouriteSettings.push(config);
}

View File

@@ -2,6 +2,7 @@
/** Display titles of the headers of the Cookie Monster settings section */ /** Display titles of the headers of the Cookie Monster settings section */
export const ConfigGroups = { export const ConfigGroups = {
Favourite: 'Favourite Settings',
Calculation: 'Calculation', Calculation: 'Calculation',
Notation: 'Notation', Notation: 'Notation',
Colours: 'Colours and colour coding', Colours: 'Colours and colour coding',

View File

@@ -815,10 +815,24 @@ const Config = {
BulkBuyBlock: new SettingStandard( BulkBuyBlock: new SettingStandard(
'bool', 'bool',
'Miscellaneous', 'Miscellaneous',
['Block Bulk Buying OFF', 'Block Bulk Buying ON'], ['Block bulk buying OFF', 'Block bulk buying ON'],
"Block clicking bulk buying when you can't buy all. This prevents buying 7 of a building when you are in buy-10 or buy-100 mode.", "Block clicking bulk buying when you can't buy all. This prevents buying 7 of a building when you are in buy-10 or buy-100 mode.",
true, true,
), ),
FavouriteSettings: new SettingStandard(
'bool',
'Miscellaneous',
[
'Favourite settings section OFF',
'Favourite settings section ON',
'Favourite settings section ON (Locked)',
],
"Show stars before each setting which allows selecting it for a 'favourites' section at the top of the Cookie Monster settings. Setting this to Locked removes the stars but shows the 'favourites' section",
true,
function () {
Game.UpdateMenu();
},
),
}; };
export default Config; export default Config;

View File

@@ -109,7 +109,9 @@ const ConfigDefault = {
WrinklerMaxSoundURL: WrinklerMaxSoundURL:
'https://freesound.org/data/previews/152/152743_15663-lq.mp3', 'https://freesound.org/data/previews/152/152743_15663-lq.mp3',
BulkBuyBlock: 0, BulkBuyBlock: 0,
FavouriteSettings: 1,
Header: { Header: {
Favourite: 1,
Calculation: 1, Calculation: 1,
Notation: 1, Notation: 1,
Colours: 1, Colours: 1,

View File

@@ -1,7 +1,7 @@
import { CMOptions } from '../../Config/VariablesAndData'; import { CMOptions } from '../../Config/VariablesAndData';
import AddMenuStats from './AddStatsPage'; import AddMenuStats from './AddStatsPage';
import AddMenuInfo from './InfoPage'; import AddMenuInfo from './InfoPage';
import AddMenuPref from './SettingsPage'; import AddMenuPref from './Settings/SettingsPage';
/** /**
* This function adds the calll the functions to add extra info to the stats and options pages * This function adds the calll the functions to add extra info to the stats and options pages

View File

@@ -0,0 +1,35 @@
import { ToggleHeader } from '../../../Config/ToggleSetting';
import { CMOptions } from '../../../Config/VariablesAndData';
/**
* This function creates a header-object for the options page
* @param {string} config The name of the Config-group
* @param {string} text The to-be displayed name of the header
* @returns {object} div The header object
*/
export default function CreatePrefHeader(config, text) {
const div = document.createElement('div');
div.className = 'title';
div.style.opacity = '0.7';
div.style.fontSize = '17px';
div.appendChild(document.createTextNode(`${text} `));
const span = document.createElement('span'); // Creates the +/- button
span.style.cursor = 'pointer';
span.style.display = 'inline-block';
span.style.height = '14px';
span.style.width = '14px';
span.style.borderRadius = '7px';
span.style.textAlign = 'center';
span.style.backgroundColor = '#C0C0C0';
span.style.color = 'black';
span.style.fontSize = '13px';
span.style.verticalAlign = 'middle';
span.textContent = CMOptions.Header[config] ? '-' : '+';
span.onclick = function () {
ToggleHeader(config);
Game.UpdateMenu();
};
div.appendChild(span);
return div;
}

View File

@@ -1,70 +1,42 @@
/** Functions related to the Options/Preferences page */
import jscolor, * as JsColor from '@eastdesire/jscolor'; import jscolor, * as JsColor from '@eastdesire/jscolor';
import { import ToggleFavouriteSetting from '../../../Config/Toggles/ToggleFavourites';
LoadConfig, import { SaveConfig } from '../../../Config/SaveLoadReload/SaveLoadReloadSettings';
SaveConfig,
} from '../../Config/SaveLoadReload/SaveLoadReloadSettings';
import { import {
ConfigPrefix, ConfigPrefix,
ToggleConfig, ToggleConfig,
ToggleConfigVolume, ToggleConfigVolume,
ToggleHeader, } from '../../../Config/ToggleSetting';
} from '../../Config/ToggleSetting'; import { CMOptions } from '../../../Config/VariablesAndData';
import { CMOptions } from '../../Config/VariablesAndData'; import {} from '../../../Data/Sectionheaders';
import { import Config from '../../../Data/SettingsData';
ConfigGroups, import RefreshScale from '../../HelperFunctions/RefreshScale';
ConfigGroupsNotification, import UpdateColours from '../../HelperFunctions/UpdateColours';
} from '../../Data/Sectionheaders'; import Flash from '../../Notifications/Flash';
import Config from '../../Data/SettingsData'; import PlaySound from '../../Notifications/Sound';
import ConfigDefault from '../../Data/SettingsDefault'; import { FavouriteSettings } from '../../VariablesAndData';
import RefreshScale from '../HelperFunctions/RefreshScale'; import CookieMonsterPrompt from '../Prompt';
import UpdateColours from '../HelperFunctions/UpdateColours';
import Flash from '../Notifications/Flash';
import PlaySound from '../Notifications/Sound';
import CookieMonsterPrompt from './Prompt';
/**
* This function creates a header-object for the options page
* @param {string} config The name of the Config-group
* @param {string} text The to-be displayed name of the header
* @returns {object} div The header object
*/
function CreatePrefHeader(config, text) {
const div = document.createElement('div');
div.className = 'title';
div.style.opacity = '0.7';
div.style.fontSize = '17px';
div.appendChild(document.createTextNode(`${text} `));
const span = document.createElement('span'); // Creates the +/- button
span.style.cursor = 'pointer';
span.style.display = 'inline-block';
span.style.height = '14px';
span.style.width = '14px';
span.style.borderRadius = '7px';
span.style.textAlign = 'center';
span.style.backgroundColor = '#C0C0C0';
span.style.color = 'black';
span.style.fontSize = '13px';
span.style.verticalAlign = 'middle';
span.textContent = CMOptions.Header[config] ? '-' : '+';
span.onclick = function () {
ToggleHeader(config);
Game.UpdateMenu();
};
div.appendChild(span);
return div;
}
/** /**
* This function creates an option-object for the options page * This function creates an option-object for the options page
* @param {string} config The name of the option * @param {string} config The name of the option
* @returns {object} div The option object * @returns {object} div The option object
*/ */
function CreatePrefOption(config) { export default function CreatePrefOption(config) {
const div = document.createElement('div'); const div = document.createElement('div');
div.className = 'listing'; div.className = 'listing';
if (CMOptions.FavouriteSettings === 1) {
const FavStar = document.createElement('a');
if (FavouriteSettings.includes(config)) FavStar.innerText = '★';
else FavStar.innerText = '☆';
FavStar.className = 'option';
FavStar.onclick = function () {
ToggleFavouriteSetting(config);
SaveConfig();
Game.UpdateMenu();
};
div.appendChild(FavStar);
div.appendChild(document.createTextNode(' '));
}
if (Config[config].type === 'bool') { if (Config[config].type === 'bool') {
const a = document.createElement('a'); const a = document.createElement('a');
if (Config[config].toggle && CMOptions[config] === 0) { if (Config[config].toggle && CMOptions[config] === 0) {
@@ -174,14 +146,13 @@ function CreatePrefOption(config) {
return div; return div;
} }
if (Config[config].type === 'colour') { if (Config[config].type === 'colour') {
div.className = ''; const innerSpan = document.createElement('span');
const innerDiv = document.createElement('div'); innerSpan.className = 'option';
innerDiv.className = 'listing';
const input = document.createElement('input'); const input = document.createElement('input');
input.id = config; input.id = config;
input.style.width = '65px'; input.style.width = '65px';
input.setAttribute('value', CMOptions[config]); input.setAttribute('value', CMOptions[config]);
innerDiv.appendChild(input); innerSpan.appendChild(input);
const change = function () { const change = function () {
CMOptions[this.targetElement.id] = this.toHEXString(); CMOptions[this.targetElement.id] = this.toHEXString();
UpdateColours(); UpdateColours();
@@ -192,7 +163,7 @@ function CreatePrefOption(config) {
new JsColor(input, { hash: true, position: 'right', onInput: change }); new JsColor(input, { hash: true, position: 'right', onInput: change });
const label = document.createElement('label'); const label = document.createElement('label');
label.textContent = Config[config].desc; label.textContent = Config[config].desc;
innerDiv.appendChild(label); innerSpan.appendChild(label);
if (config.includes('Flash')) { if (config.includes('Flash')) {
const a = document.createElement('a'); const a = document.createElement('a');
a.className = 'option'; a.className = 'option';
@@ -200,9 +171,9 @@ function CreatePrefOption(config) {
Flash(3, config.replace('Colour', ''), true); Flash(3, config.replace('Colour', ''), true);
}; };
a.textContent = 'Test flash'; a.textContent = 'Test flash';
innerDiv.appendChild(a); innerSpan.appendChild(a);
} }
div.appendChild(innerDiv); div.appendChild(innerSpan);
jscolor.init(); jscolor.init();
return div; return div;
} }
@@ -233,62 +204,3 @@ function CreatePrefOption(config) {
} }
return div; return div;
} }
/**
* This function adds the options/settings of CookieMonster to the options page
* It is called by CM.Disp.AddMenu
* @param {object} title On object that includes the title of the menu
*/
export default function AddMenuPref(title) {
const frag = document.createDocumentFragment();
frag.appendChild(title);
Object.keys(ConfigGroups).forEach((group) => {
const groupObject = CreatePrefHeader(group, ConfigGroups[group]); // (group, display-name of group)
frag.appendChild(groupObject);
if (CMOptions.Header[group]) {
// 0 is show, 1 is collapsed
// Make sub-sections of Notification section
if (group === 'Notification') {
Object.keys(ConfigGroupsNotification).forEach((subGroup) => {
const subGroupObject = CreatePrefHeader(
subGroup,
ConfigGroupsNotification[subGroup],
); // (group, display-name of group)
subGroupObject.style.fontSize = '15px';
subGroupObject.style.opacity = '0.5';
frag.appendChild(subGroupObject);
if (CMOptions.Header[subGroup]) {
Object.keys(Config).forEach((option) => {
if (Config[option].group === subGroup)
frag.appendChild(CreatePrefOption(option));
});
}
});
} else {
Object.keys(Config).forEach((option) => {
if (Config[option].group === group)
frag.appendChild(CreatePrefOption(option));
});
}
}
});
const resDef = document.createElement('div');
resDef.className = 'listing';
const resDefBut = document.createElement('a');
resDefBut.className = 'option';
resDefBut.onclick = function () {
LoadConfig(ConfigDefault);
};
resDefBut.textContent = 'Restore Default';
resDef.appendChild(resDefBut);
frag.appendChild(resDef);
l('menu').childNodes[2].insertBefore(
frag,
l('menu').childNodes[2].childNodes[
l('menu').childNodes[2].childNodes.length - 1
],
);
}

View File

@@ -0,0 +1,79 @@
import { LoadConfig } from '../../../Config/SaveLoadReload/SaveLoadReloadSettings';
import { CMOptions } from '../../../Config/VariablesAndData';
import {
ConfigGroups,
ConfigGroupsNotification,
} from '../../../Data/Sectionheaders';
import Config from '../../../Data/SettingsData';
import ConfigDefault from '../../../Data/SettingsDefault';
import { FavouriteSettings } from '../../VariablesAndData';
import CreatePrefHeader from './CreateHeader';
import CreatePrefOption from './CreateOption';
/**
* This function adds the options/settings of CookieMonster to the options page
* It is called by CM.Disp.AddMenu
* @param {object} title On object that includes the title of the menu
*/
export default function AddMenuPref(title) {
const frag = document.createDocumentFragment();
frag.appendChild(title);
Object.keys(ConfigGroups).forEach((group) => {
if (group === 'Favourite') {
if (FavouriteSettings.length !== 0 && CMOptions.FavouriteSettings > 0) {
frag.appendChild(CreatePrefHeader(group, ConfigGroups[group])); // (group, display-name of group)
if (CMOptions.Header[group])
for (let index = 0; index < FavouriteSettings.length; index++) {
frag.appendChild(CreatePrefOption(FavouriteSettings[index]));
}
}
} else {
frag.appendChild(CreatePrefHeader(group, ConfigGroups[group])); // (group, display-name of group)
if (CMOptions.Header[group]) {
// 0 is show, 1 is collapsed
// Make sub-sections of Notification section
if (group === 'Notification') {
Object.keys(ConfigGroupsNotification).forEach((subGroup) => {
const subGroupObject = CreatePrefHeader(
subGroup,
ConfigGroupsNotification[subGroup],
); // (group, display-name of group)
subGroupObject.style.fontSize = '15px';
subGroupObject.style.opacity = '0.5';
frag.appendChild(subGroupObject);
if (CMOptions.Header[subGroup]) {
Object.keys(Config).forEach((option) => {
if (Config[option].group === subGroup)
frag.appendChild(CreatePrefOption(option));
});
}
});
} else {
Object.keys(Config).forEach((option) => {
if (Config[option].group === group)
frag.appendChild(CreatePrefOption(option));
});
}
}
}
});
const resDef = document.createElement('div');
resDef.className = 'listing';
const resDefBut = document.createElement('a');
resDefBut.className = 'option';
resDefBut.onclick = function () {
LoadConfig(ConfigDefault);
};
resDefBut.textContent = 'Restore Default';
resDef.appendChild(resDefBut);
frag.appendChild(resDef);
l('menu').childNodes[2].insertBefore(
frag,
l('menu').childNodes[2].childNodes[
l('menu').childNodes[2].childNodes.length - 1
],
);
}

View File

@@ -143,3 +143,8 @@ export let TooltipBonusMouse;
export let LastAscendState; export let LastAscendState;
export let LastNumberOfTimers; export let LastNumberOfTimers;
/**
* This stores the names of settings shown in the favourites section
*/
export let FavouriteSettings = [];

View File

@@ -1,5 +1,7 @@
/* eslint-disable no-unused-vars */
import { LoadConfig } from '../Config/SaveLoadReload/SaveLoadReloadSettings'; import { LoadConfig } from '../Config/SaveLoadReload/SaveLoadReloadSettings';
import { VersionMajor, VersionMinor } from '../Data/Moddata'; import { VersionMajor, VersionMinor } from '../Data/Moddata';
import { FavouriteSettings } from '../Disp/VariablesAndData';
import InitData from '../Sim/InitializeData/InitData'; import InitData from '../Sim/InitializeData/InitData';
/** /**
@@ -9,6 +11,9 @@ import InitData from '../Sim/InitializeData/InitData';
export default function load(str) { export default function load(str) {
const save = JSON.parse(str); const save = JSON.parse(str);
InitData(); InitData();
// The if-statement is a failsafe for old saves
if (typeof save.favouriteSettings !== 'undefined')
FavouriteSettings = save.favouriteSettings;
LoadConfig(save.settings); LoadConfig(save.settings);
if (save.version !== `${VersionMajor}.${VersionMinor}`) { if (save.version !== `${VersionMajor}.${VersionMinor}`) {
if (Game.prefs.popups) if (Game.prefs.popups)

View File

@@ -1,5 +1,6 @@
import { CMOptions } from '../Config/VariablesAndData'; import { CMOptions } from '../Config/VariablesAndData';
import { VersionMajor, VersionMinor } from '../Data/Moddata'; import { VersionMajor, VersionMinor } from '../Data/Moddata';
import { FavouriteSettings } from '../Disp/VariablesAndData';
/** /**
* This creates a save function to the CM object. Per Game code/comments: * This creates a save function to the CM object. Per Game code/comments:
@@ -8,6 +9,7 @@ import { VersionMajor, VersionMinor } from '../Data/Moddata';
*/ */
export default function save() { export default function save() {
return JSON.stringify({ return JSON.stringify({
favouriteSettings: FavouriteSettings,
settings: CMOptions, settings: CMOptions,
version: `${VersionMajor}.${VersionMinor}`, version: `${VersionMajor}.${VersionMinor}`,
}); });