diff options
Diffstat (limited to 'features/settings/index.js')
-rw-r--r-- | features/settings/index.js | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/features/settings/index.js b/features/settings/index.js new file mode 100644 index 0000000..6d41754 --- /dev/null +++ b/features/settings/index.js @@ -0,0 +1,249 @@ +/// <reference types="../../../CTAutocomplete" /> +/// <reference lib="es2015" /> +import Feature from "../../featureClass/class"; +import * as GuiManager from "../../../guimanager/index.js" +import SoopyGuiElement from "../../../guimanager/GuiElement/SoopyGuiElement"; +import SoopyTextElement from "../../../guimanager/GuiElement/SoopyTextElement"; +import SoopyBoxElement from "../../../guimanager/GuiElement/SoopyBoxElement"; +import TextWithArrow from "../../../guimanager/GuiElement/TextWithArrow"; +import ButtonWithArrow from "../../../guimanager/GuiElement/ButtonWithArrow"; +import BoxWithToggleAndDescription from "../../../guimanager/GuiElement/BoxWithToggleAndDescription"; +import ButtonWithArrowAndDescription from "../../../guimanager/GuiElement/ButtonWithArrowAndDescription"; +import SoopyMouseClickEvent from "../../../guimanager/EventListener/SoopyMouseClickEvent"; +import SoopyContentChangeEvent from "../../../guimanager/EventListener/SoopyContentChangeEvent"; +import SoopyOpenGuiEvent from "../../../guimanager/EventListener/SoopyOpenGuiEvent"; +import settingsCommunicator from "./settingsCommunicator"; +import GuiPage from "../soopyGui/GuiPage" + + +class SettingsRenderer extends Feature { + constructor() { + super() + + this.gui = undefined + + this.pages = [] + this.currentPage = 0 + this.backButton = undefined + this.settingsCategoryArea = undefined + this.settingsTitle = undefined + this.settingsArea = undefined + this.modifyingFeature = false + this.featureLoadedTextBox = undefined + + this.SettingPage = undefined + } + + onEnable(){ + + this.SettingPage = new SettingPage() + this.SettingPage.FeatureManager = this.FeatureManager + + return; + } + + onDisable(){ + this.SettingPage = undefined + return; + this.gui.delete() + + this.pages = [] + this.currentPage = 0 + this.backButton = undefined + this.settingsArea = undefined + this.settingsTitle = undefined + this.settingsCategoryArea = undefined + this.modifyingFeature = false + this.featureLoadedTextBox = undefined + } + + clickedOpenSettings(){ + + + this.goToPage(1) + } + + clickedBackButton(){ + this.goToPage(this.currentPage-1) + } + + goToPage(pageNum, animate=true){ + pageNum = Math.max(0, Math.min(pageNum, this.pages.length-1)) + + if(pageNum == this.currentPage){ + return + } + + this.currentPage = pageNum + + this.pages.forEach((p, i)=>{ + p.forEach(e=>{ + e.location.location.x.set(i-pageNum, animate?1000:0) + }) + }) + + this.backButton.location.location.y.set(pageNum === 0?-0.2:0, animate?1000:0) + } +} + +class SettingPage extends GuiPage { + constructor(){ + super(10) + + this.name = "Settings" + + this.pages = [this.newPage(), this.newPage()] + + this.settingsCategoryArea = undefined + this.settingsTitle = undefined + this.settingsArea = undefined + this.modifyingFeature = false + this.featureLoadedTextBox = undefined + + this.SettingPage = undefined + + this.pages[0].addEvent(new GuiManager.SoopyRenderEvent().setHandler(()=>{this.updateLocs()})) + + //############################################################################################### + // Settings Category Page + //############################################################################################### + + + + let settingsCategoryTitle = new SoopyTextElement().setText("ยง0Settings").setMaxTextScale(3).setLocation(0.1, 0.05, 0.8, 0.1) + this.pages[0].addChild(settingsCategoryTitle) + + this.settingsCategoryArea = new SoopyGuiElement().setLocation(0.1, 0.2, 0.8, 0.8).setScrollable(true) + this.pages[0].addChild(this.settingsCategoryArea) + + + //############################################################################################### + // Settings Page + //############################################################################################### + + this.settingsTitle = new SoopyTextElement().setMaxTextScale(3).setLocation(0.1, 0.05, 0.8, 0.1) + this.pages[1].addChild(this.settingsTitle) + + this.settingsArea = new SoopyGuiElement().setLocation(0.1, 0.2, 0.8, 0.8).setScrollable(true) + this.pages[1].addChild(this.settingsArea) + + + this.finaliseLoading() + } + + onOpen(){ + this.updateSettingCategories() + this.settingsCategoryArea.location.scroll.x.set(0, 0) + this.settingsCategoryArea.location.scroll.y.set(0, 0) + } + + updateSettingCategories(){ + this.settingsCategoryArea.children = [] + + let i = 0 + + Object.keys(this.FeatureManager.featureMetas).sort((a, b)=>{return a.sortA-b.sortA}).forEach((f)=>{ + let meta = this.FeatureManager.featureMetas[f] + + let isHidden = meta.isHidden + if(typeof isHidden === "string"){ + isHidden = require("../" + f + "/" + isHidden).default() + } + if(isHidden) return + + let category = new ButtonWithArrowAndDescription().setText("&0" + meta.name).setDesc("&0" +meta.description).setLocation(0, 0.225*i, 1, 0.2) + category.addEvent(new SoopyMouseClickEvent().setHandler(()=>{this.clickedOpenCategory(f)})) + + this.settingsCategoryArea.addChild(category) + + i++ + }) + // this.FeatureManager.features = {}; enabled features + } + + updateSettings(category){ + let meta = this.FeatureManager.featureMetas[category] + + this.settingsArea.children = [] + + this.settingsTitle.setText("&0" + this.FeatureManager.featureMetas[category].name) + + let height = 0 + + if(meta.isTogglable){ + let toggle = new BoxWithToggleAndDescription().setLocation(0, height, 1, 0.2).setText("&0Main toggle").setDesc("&0This is the main toggle for the whole category") + this.settingsArea.addChild(toggle) + + toggle.toggle.setValue(this.FeatureManager.isFeatureLoaded(category), 0) + + toggle.toggle.addEvent(new SoopyContentChangeEvent().setHandler((newVal, oldVal, resetFun)=>{ + //dont allow editing if currenately loading/unloading it + if(this.modifyingFeature){ + resetFun() + return + } + + //toggle the feature + this.modifyingFeature = true + new Thread(()=>{ + this.FeatureManager.featureSettingsData[category].enabled = newVal + this.FeatureManager.featureSettingsDataLastUpdated = true + + if(!newVal && this.FeatureManager.isFeatureLoaded(category)){ + this.FeatureManager.unloadFeature(category) + } + if(newVal && !this.FeatureManager.isFeatureLoaded(category)){ + this.FeatureManager.loadFeature(category) + } + + Thread.sleep(100) + + this.modifyingFeature = false + + this.updateSettings(category) + }).start() + })) + height += toggle.location.size.y.get()+0.045 + } + + if(!this.FeatureManager.isFeatureLoaded(category)){ + + //only show if feature issnt loaded + + let textBox = new SoopyBoxElement().setLocation(0, height, 1, 0.2) + .addChild(new SoopyTextElement().setText("&0Feature not loaded").setLocation(0, 0, 1, 0.5)) + .addChild(new SoopyTextElement().setText("&0Load feature to access settings").setLocation(0, 0.5, 1, 0.5)) + this.settingsArea.addChild(textBox) + return; + } + + settingsCommunicator.getModuleSettings(category).forEach(setting=>{ + setting.location.location.y.set(height, 0) + this.settingsArea.addChild(setting) + + height += 0.045+setting.location.size.y.get() + }) + } + + updateLocs(){ + let totalHeight = 0 + + this.settingsArea.children.forEach(e=>{ + e.location.location.y.set(totalHeight, 0) + + totalHeight += e.location.size.y.get()+Math.min(0.045,e.location.size.y.get()) + }) + } + + clickedOpenCategory(category){ + this.updateSettings(category) + this.goToPage(2) + + this.settingsArea.location.scroll.x.set(0, 0) + this.settingsArea.location.scroll.y.set(0, 0) + } +} + +module.exports = { + class: new SettingsRenderer() +}
\ No newline at end of file |