diff options
Diffstat (limited to 'src/features/settings/index.js')
-rw-r--r-- | src/features/settings/index.js | 332 |
1 files changed, 332 insertions, 0 deletions
diff --git a/src/features/settings/index.js b/src/features/settings/index.js new file mode 100644 index 0000000..38ccb9d --- /dev/null +++ b/src/features/settings/index.js @@ -0,0 +1,332 @@ +/// <reference types="../../../../CTAutocomplete" /> +/// <reference lib="es2015" /> +import Feature from "../../featureClass/class"; +import SoopyGuiElement from "../../../guimanager/GuiElement/SoopyGuiElement"; +import SoopyTextElement from "../../../guimanager/GuiElement/SoopyTextElement"; +import SoopyBoxElement from "../../../guimanager/GuiElement/SoopyBoxElement"; +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 settingsCommunicator from "./settingsCommunicator"; +import GuiPage from "../soopyGui/GuiPage" +import { SoopyGui, SoopyRenderEvent } from "../../../guimanager"; +import TextBox from "../../../guimanager/GuiElement/TextBox"; +import locationSettingHolder from "./locationSettingHolder"; + + +class SettingsRenderer extends Feature { + constructor() { + super() + } + + onEnable() { + this.SettingPage = new SettingPage() + this.EditLocationsPage = new EditLocationsPage() + this.SettingPage.FeatureManager = this.FeatureManager + + this.registerStep(true, 1, () => { + if (!this.EditLocationsPage) return + + if (this.EditLocationsPage.needsExitPage) { + this.EditLocationsPage.goToPage(0, 500) + this.EditLocationsPage.needsExitPage = false + } + }) + + this.registerCommand("soopytogglesetting", (category, setting) => { + settingsCommunicator.settings?.[category]?.[setting]?.setValue(!settingsCommunicator.settings?.[category]?.[setting]?.getValue()) + }) + + } + + onDisable() { + this.EditLocationsPage = undefined + this.SettingPage = undefined + } +} + +class EditLocationsPage extends GuiPage { + + constructor() { + super(9) + + this.name = "Edit GUI Locations" + + this.needsExitPage = false + + this.soopyGui = new SoopyGui() + this.soopyGui._renderBackground = () => { } //remove background darkening + + + + this.soopyGui.ctGui.registerDraw((mouseX, mouseY, partialTicks) => { + this.renderGui(mouseX, mouseY) + this.soopyGui._render(mouseX, mouseY, partialTicks) + }) + this.soopyGui.ctGui.registerClicked((mouseX, mouseY, button) => { + this.clicked(mouseX, mouseY) + this.soopyGui._onClick(mouseX, mouseY, button) + }) + this.soopyGui.ctGui.registerMouseReleased((mouseX, mouseY) => { + this.released(mouseX, mouseY) + }) + + this.finaliseLoading() + } + + renderGui(mouseX, mouseY) { + for (let setting of locationSettingHolder.getData()) { + if (setting.parent) { + if (setting.parent.isEnabled()) { + setting.renderGui(mouseX, mouseY) + } + } else { + setting.renderGui(mouseX, mouseY) + } + } + } + + clicked(mouseX, mouseY) { + for (let setting of locationSettingHolder.getData()) { + if (setting.clicked(mouseX, mouseY)) return //dont allow the user to drag 2 locations at once + } + } + + released(mouseX, mouseY) { + for (let setting of locationSettingHolder.getData()) { + setting.released(mouseX, mouseY) + } + } + + onOpen() { + this.needsExitPage = true + + this.soopyGui.open() + } +} + +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 SoopyRenderEvent().setHandler(() => { this.updateLocs() })) + + //############################################################################################### + // Settings Category Page + //############################################################################################### + + + let settingsCategoryTitle = new SoopyTextElement().setText("ยง0Settings").setMaxTextScale(3).setLocation(0.1, 0.05, 0.5, 0.1) + this.pages[0].addChild(settingsCategoryTitle) + + this.settingsCategorySearch = new TextBox().setPlaceholder("Search...").setLocation(0.6, 0.05 + 0.0125, 0.3, 0.075) + this.pages[0].addChild(this.settingsCategorySearch) + + this.settingsCategorySearch.text.addEvent(new SoopyContentChangeEvent().setHandler(() => { + this.updateSettingCategories() + })) + + 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) + this.settingsCategoryArea._scrollAmount = 0 + + this.settingsCategorySearch.setText("") + this.updateSettingCategories() + } + + onOpenPage(p) { + if (p === 1) this.updateSettingCategories() + + this.closeSidebarPage() + } + + updateSettingCategories() { + + let search = this.settingsCategorySearch.text.text + + this.settingsCategoryArea.children = [] + + let height = 0 + + Object.keys(this.FeatureManager.featureMetas).sort((a, b) => { return a.sortA - b.sortA }).forEach((f) => { + + let meta = this.FeatureManager.featureMetas[f] + + let showing = search.length === 0 + + if (!showing) { + showing = meta.name.toLowerCase().includes(search.toLowerCase()) || meta.description.toLowerCase().includes(search.toLowerCase()) + } + + if (!showing) { + settingsCommunicator.getModuleSettings(f).forEach(setting => { + + if (setting && (setting.name.toLowerCase().includes(search.toLowerCase()) || setting.description.toLowerCase().includes(search.toLowerCase()))) { + showing = true + } + }) + } + + if (!showing) return + + let isHidden = meta.isHidden + if (typeof isHidden === "string") { + isHidden = require("../" + f + "/" + isHidden).hidden(this.FeatureManager) + } + if (isHidden) return + + let category = new ButtonWithArrowAndDescription().setText("&0" + meta.name).setDesc("&0" + meta.description).setLocation(0, height, 1, 0.15) + category.addEvent(new SoopyMouseClickEvent().setHandler(() => { this.clickedOpenCategory(f) })) + + this.settingsCategoryArea.addChild(category) + + height += 0.175 + + + if (search.length > 0) { + settingsCommunicator.getModuleSettings(f).forEach(setting => { + + if (setting && (setting.name.toLowerCase().includes(search.toLowerCase()) || setting.description.toLowerCase().includes(search.toLowerCase()))) { + + setting.getGuiObject().location.location.y.set(height, 0) + this.settingsCategoryArea.addChild(setting.getGuiObject()) + + height += 0.025 + setting.getGuiObject().location.size.y.get() + + setting.update() + } + }) + } + }) + + + // 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.15).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 + 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) + } + + + this.modifyingFeature = false + + this.updateSettings(category) + })) + 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.15) + .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.getGuiObject().location.location.y.set(height, 0) + this.settingsArea.addChild(setting.getGuiObject()) + + height += 0.045 + setting.getGuiObject().location.size.y.get() + + setting.update() + }) + } + + 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()) + }) + + totalHeight = 0 + + this.settingsCategoryArea.children.forEach(e => { + e.location.location.y.set(totalHeight, 0) + + totalHeight += e.location.size.y.get() + Math.min(0.025, 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) + this.settingsArea._scrollAmount = 0 + } +} + +module.exports = { + class: new SettingsRenderer() +}
\ No newline at end of file |