/**
* This JS file is for settings :
* - Theme
* - Script language
* - Font size
*/
class SettingsPG {
constructor(parent) {
this.parent = parent;
// The elements that will color with languages
this.elementForscriptLanguage = [
'#exampleList #exampleBanner',
'.navbar',
'.navbar .category',
'.navbar .select .toDisplay',
'.navbar .select .toDisplay .subSelect .toDisplaySub',
'#fpsLabel',
'.save-form',
'#switchWrapper',
'.navbarBottom',
'.navbarBottom .links .link a',
'.buttonPG'
];
// The elements that will color with theme
this.elementToTheme = [
'.wrapper #jsEditor',
'.wrapper .gutter'
];
// Editor font size
this.safeMode = localStorage.getItem("bjs-playground-safeMode") || false;
this.ctrlS = localStorage.getItem("bjs-playground-ctrlS") || true;
// Editor font size
this.fontSize = localStorage.getItem("bjs-playground-font") || 14;
// Editor theme
this.vsTheme = localStorage.getItem("bjs-playground-theme") || 'light';
// Editor language
this.scriptLanguage = localStorage.getItem("bjs-playground-scriptLanguage") || 'JS';
this.defaultScene = "scripts/basic scene.js";
if (this.scriptLanguage == "JS") {
this.defaultScene = "scripts/basic scene.js";
this.parent.monacoCreator.monacoMode = "javascript";
} else if (this.scriptLanguage == "TS") {
this.defaultScene = "scripts/basic scene.txt";
this.parent.monacoCreator.monacoMode = "typescript";
}
}
get ScriptLanguage() {
return this.scriptLanguage;
};
set ScriptLanguage(value) {
localStorage.setItem("bjs-playground-scriptLanguage", value);
this.scriptLanguage = value;
};
get DefaultScene() {
return this.defaultScene;
};
/**
* Change safe mode
*/
setSafeMode(value) {
localStorage.setItem("bjs-playground-safeMode", value);
this.safeMode = value;
if (value) {
this.parent.utils.setToMultipleID("safemodeToggle", "innerHTML", 'Safe mode ');
} else {
this.parent.utils.setToMultipleID("safemodeToggle", "innerHTML", 'Safe mode ');
}
};
restoreSafeMode() {
this.setSafeMode(this.safeMode);
};
/**
* Change CTRL+S
*/
setCTRLS(value) {
localStorage.setItem("bjs-playground-ctrlS", value);
this.ctrlS = value;
if (value) {
this.parent.utils.setToMultipleID("ctrlsToggle", "innerHTML", 'CTRL+S to save ');
} else {
this.parent.utils.setToMultipleID("ctrlsToggle", "innerHTML", 'CTRL+S to save ');
}
};
restoreCTRLS() {
this.setSafeMode(this.ctrlS);
};
/**
* Change font size
*/
setFontSize(size) {
localStorage.setItem("bjs-playground-font", size);
this.fontSize = size;
this.parent.monacoCreator.jsEditor.updateOptions({
fontSize: size
});
var array = document.getElementsByClassName("displayFontSize");
for (var i = 0; i < array.length; i++) {
var subArray = array[i].children;
for (var j = 0; j < subArray.length; j++) {
subArray[j].classList.remove("selected");
if (subArray[j].innerText == size)
subArray[j].classList.add("selected");
}
}
};
restoreFont() {
this.setFontSize(this.fontSize);
};
/**
* Toggle Typescript / Javascript language
*/
setScriptLanguage() {
for (var index = 0; index < this.elementForscriptLanguage.length; index++) {
var obj = this.elementForscriptLanguage[index];
var domObjArr = document.querySelectorAll(obj);
for (var domObjIndex = 0; domObjIndex < domObjArr.length; domObjIndex++) {
var domObj = domObjArr[domObjIndex];
domObj.classList.remove('languageJS');
domObj.classList.remove('languageTS');
domObj.classList.add("language" + this.scriptLanguage);
}
}
if (this.scriptLanguage == "JS") {
this.parent.utils.setToMultipleID("toJSbutton", "removeClass", "floatLeft");
this.parent.utils.setToMultipleID("toJSbutton", "addClass", "selectedLanguage");
this.parent.utils.setToMultipleID("toJSbutton", "innerHTML", "Javascript");
this.parent.utils.setToMultipleID("toTSbutton", "title", "Switch to TypeScript");
} else if (this.scriptLanguage == "TS") {
this.parent.utils.setToMultipleID("toJSbutton", "addClass", "floatLeft");
this.parent.utils.setToMultipleID("toTSbutton", "addClass", "selectedLanguage");
this.parent.utils.setToMultipleID("toTSbutton", "innerHTML", "Typescript");
this.parent.utils.setToMultipleID("toJSbutton", "title", "Switch to JavaScript");
}
};
/**
* Set the theme (dark / light)
*/
setTheme(theme) {
localStorage.setItem("bjs-playground-theme", theme);
// Get the Monaco theme name.
// Change the selected button style
this.parent.utils.setToMultipleID("darkTheme", "removeClass", "selected");
this.parent.utils.setToMultipleID("lightTheme", "removeClass", "selected");
if (theme == 'dark') {
this.vsTheme = 'vs-dark';
this.parent.utils.setToMultipleID("darkTheme", "addClass", "selected");
} else {
this.vsTheme = 'vs';
this.parent.utils.setToMultipleID("lightTheme", "addClass", "selected");
}
this.parent.monacoCreator.createMonacoEditor();
this.setFontSize(this.fontSize);
// Color the elements to theme
for (var index = 0; index < this.elementToTheme.length; index++) {
var obj = this.elementToTheme[index];
var domObjArr = document.querySelectorAll(obj);
for (var domObjIndex = 0; domObjIndex < domObjArr.length; domObjIndex++) {
var domObj = domObjArr[domObjIndex];
domObj.classList.remove('light');
domObj.classList.remove('dark');
domObj.classList.add(theme);
}
}
};
restoreTheme() {
this.setTheme(this.vsTheme, this.parent.monacoCreator);
};
/**
* Set BJS version on click
*/
setBJSversion(evt, code) {
localStorage.setItem("bjs-playground-apiversion", evt.target.value);
localStorage.setItem("bjs-playground-apiversion-tempcode", code);
window.location.reload();
};
/**
* Check if we need to restore a BJS version
*/
restoreVersion() {
if (this.mustModifyBJSversion()) {
this.parent.menuPG.displayWaitDiv();
window.def = window.define;
window.define = undefined;
var apiVersion = localStorage.getItem("bjs-playground-apiversion");
BABYLON = null;
var position = 0;
for (var i = 0; i < CONFIG_last_versions.length; i++) {
if (CONFIG_last_versions[i][0] == apiVersion) {
position = i;
break;
}
}
var count = CONFIG_last_versions[position][1].length - 1;
var newBJSscript = document.createElement('script');
newBJSscript.src = CONFIG_last_versions[position][1][0];
newBJSscript.onload = function () {
for (var i = 1; i < CONFIG_last_versions[position][1].length; i++) {
var newBJSscript = document.createElement('script');
newBJSscript.src = CONFIG_last_versions[position][1][i];
newBJSscript.onload = function () {
count--;
if (count == 0) {
if (BABYLON.Engine.Version.search('-') != -1) this.parent.menuPG.displayVersionNumber("Latest");
else this.parent.menuPG.displayVersionNumber(BABYLON.Engine.Version);
this.parent.utils.setToMultipleID("mainTitle", "innerHTML", "v" + BABYLON.Engine.Version);
this.parent.monacoCreator.addOnMonacoLoadedCallback(() => {
this.parent.monacoCreator.setCode(localStorage.getItem("bjs-playground-apiversion-tempcode"));
localStorage.removeItem("bjs-playground-apiversion");
localStorage.removeItem("bjs-playground-apiversion-tempcode");
this.parent.main.compileAndRunFromOutside();
});
if (window.def) {
window.define = window.def;
}
}
}.bind(this);
document.head.appendChild(newBJSscript);
}
}.bind(this);
document.head.appendChild(newBJSscript);
} else return false;
};
mustModifyBJSversion() {
if (localStorage.getItem("bjs-playground-apiversion") && localStorage.getItem("bjs-playground-apiversion") != null && localStorage.getItem("bjs-playground-apiversion") != "Latest") return true;
else return false;
};
};